//
//  Problem1051.swift
//  TestProject
//
//  Created by 武侠 on 2021/4/13.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit
/*
 1051. 高度检查器
 
 学校在拍年度纪念照时，一般要求学生按照 非递减 的高度顺序排列。
 请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。
 注意，当一组学生被选中时，他们之间可以以任何可能的方式重新排序，而未被选中的学生应该保持不动。

 总结：排序后的数组，看看有几个下标和原来的数组下标对于的数组不同
 示例：
     输入：heights = [1,1,4,2,1,3]
     输出：3
     解释：
     当前数组：[1,1,4,2,1,3]
     目标数组：[1,1,1,2,3,4]
     在下标 2 处（从 0 开始计数）出现 4 vs 1 ，所以我们必须移动这名学生。
     在下标 4 处（从 0 开始计数）出现 1 vs 3 ，所以我们必须移动这名学生。
     在下标 5 处（从 0 开始计数）出现 3 vs 4 ，所以我们必须移动这名学生。
 示例 2：
     输入：heights = [5,1,2,3,4]
     输出：5
 示例 3：
     输入：heights = [1,2,3,4,5]
     输出：0
 提示：
     1 <= heights.length <= 100
     1 <= heights[i] <= 100
 */
@objcMembers class Problem1051: NSObject {
    func solution() {
        print(heightChecker([1,1,4,2,1,3]))
        print(heightChecker([5,1,2,3,4]))
        print(heightChecker([1,2,3,4,5]))
    }
    
    /*
     1: 创建一个数组：list[101]， 用来计算相同的数字的个数， 因为：1 <= heights.length <= 100
     2: 遍历数组heights，把height放入list[height] += 1, 这样得到相同的数字的个数
     3: 再次遍历数组heights，看height，取list中第一个>0的下标是否相等，不相同结果计数+1，并让list[i] -=1
     */
    func heightChecker(_ heights: [Int]) -> Int {
        // 1 <= heights.length <= 100
        var list = Array(repeating: 0, count: 101)
        for height in heights {
            list[height] += 1
        }
        var result = 0
        var start = 1
        for height in heights {
            while list[start] == 0 {
                start += 1
            }
            list[start] -= 1
            if height != start {
                result += 1
            }
        }
        return result
    }
}
